(function () {
    "use strict";

    angular.module('core').controller('configFinanceiroController', controller);
    controller.$inject = ['$scope', '$filter', '$timeout', '$q', 'Upload', 'configService', 'lookupService'];

    function controller($scope, $filter, $timeout, $q, Upload, configService, lookupService) {
        $scope.initializeLayout('Ajustes');

        $scope.state = {
            data: {},
            tabCorrente: 'financeiro',
            tabs: [
                { id: 'financeiro', titulo: 'Financeiro', icone: 'attach_money' },
                { id: 'varejo', titulo: 'Varejo', icone: 'shopping_basket' },
                { id: 'atacado', titulo: 'Atacado', icone: 'shopping_cart' },
                { id: 'tema', titulo: 'Temas', icone: 'palette' },
            ],
            imagem: { files: [], data: [], progressPercentage: 0, visible: true },
        };
        $scope.auxiliar = {
            temas: [],
            filial: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllFilial({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            cliente: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllCliente({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            categoriaFinanceira: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllCategoriaFinanceira({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            subcategoriaFinanceira: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllSubcategoriaFinanceira({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            contaAnalitica: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllContaAnalitica({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            contaCorrente: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllContaCorrente({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            rateioCentroCusto: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllRateioCentroCusto({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
        };

        /* funções */
        $scope.initialize = function () {
            $scope.refresh();
        };

        $scope.get = function () {
            configService
                .get(true)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                            console.error(response.Exception);
                        } else {
                            $scope.state.data = response.Data;
                        }
                    },
                    function (_error) {
                        $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                        console.error(_error);
                    }
                );
        };
        $scope.getAllTema = function () {
            configService
                .getAllTema()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.tools.toastr.error(response.Message, "Serviço");
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.temas);
                    },
                    function (_error) { $scope.tools.toastr.error(error, "Serviço"); }
                );
        }

        $scope.setTema = function (tema) {
            $scope.state.data.Tema = tema;
            $scope.changeStyles();
        };
        $scope.hasChanges = function () {
            return !angular.equals($scope.state.data, $scope.config.data);
        };
        $scope.save = async function () {
            try {
                var response = await configService.save($scope.state.data);

                if (response.Status < 0)
                    $scope.tools.toastr.error(response.Message, "Serviço");
                else {
                    await $scope.refresh();
                    await $scope.config.get();
                    $scope.tools.toastr.info('Configurações salvas com êxito.');
                }
            }
            catch (err) {
                $scope.tools.toastr.error(err.message, "Serviço");
                console.error(err);
            }
        };
        $scope.discardChanges = function () {
            angular.copy($scope.config.data, $scope.state.data);
            $scope.changeStyles();
        };
        $scope.upload = function (files) {
            if (files && files.length) {
                for (var i = 0; i < files.length; i++) {
                    var file = files[i];
                    if (!file.$error) {
                        Upload
                            .upload({ url: '/config/upload', data: { 'username': '', file: file } })
                            .then(
                                function (response) {
                                    if (response.Status < 0)
                                        $scope.tools.toastr.error(response.Data, 'Serviço de upload');
                                    else {
                                        angular.copy(angular.fromJson(response), $scope.state.imagem.data);

                                        /*begin refresh usando ng-if*/
                                        $scope.cacheVersion.setNew();
                                        $scope.state.imagem.visible = false;
                                        $timeout(function () { $scope.state.imagem.visible = true; });
                                        /*end refresh*/
                                    }
                                },
                                null,
                                function (event) { $scope.state.imagem.progressPercentage = parseInt(100.0 * event.loaded / event.total); }
                            );
                    }
                }
            }
        };

        $scope.refresh = function () {
            $scope.get(false);
            $scope.getAllTema();
        };
        $scope.changeStyles = function () {
            /* atualiza o tema dinamicamente de acordo com o selecionado */
            $('link[rel="stylesheet"][href*=site]').each(function () {
                this.href = '/content/css/' + $scope.state.data.Tema + '.css';
            });
        };

        $scope.initialize();

        $scope.$watch('state.imagem.files', function () {
            $scope.upload($scope.state.imagem.files);
        });
    }

})();